from docxtpl import DocxTemplate, InlineImage, RichText
from docx.shared import Mm
import base64
from io import BytesIO


class Docx:

    def __init__(self, src_path, dst_path):
        self.src_path = src_path
        self.dst_path = dst_path
        self.tpl = DocxTemplate(src_path)

    def render(self, data):
        self.tpl.render(data)

    def save(self):
        self.tpl.save(self.dst_path)


if __name__ == '__main__':

    doc = Docx('./data/template/tp1.docx', './data/test1.docx')

    rt = RichText('an exemple of ')
    rt.add(' with ')
    rt.add('some italic', italic=True)  # 斜体
    rt.add(' and ')
    rt.add('some violet', color='#ff00ff')  # 颜色
    rt.add(' and ')
    rt.add('some striked', strike=True)  # 删除线
    rt.add(' and ')
    rt.add('some small', size=14)  # 字体大小
    rt.add(' or ')
    rt.add('big', size=60)
    rt.add(' text.')
    rt.add(' Et voilà ! ')
    rt.add('\n1st line')
    rt.add('\n2nd line')  # 换行
    rt.add('\n3rd line')
    rt.add('\n\n<cool>')

    i2 = """"""

    i2 = BytesIO(base64.b64decode(i2.split(',')[1]))

    context = {
        'title': 'aa',  # 文本
        'date': '2024-12-01',
        'text': """有什么人能用绿竹作弓矢，射入云空，永不落下？我之想象，犹如长箭，向云空射去，去即不返。长箭所注，在碧蓝而明静之广大虚空。

明智者若善用其明智，即可从此云空中，读示一小文，文中有微叹与沉默，色与香，爱和怨。无著者姓名。无年月。无故事。无……然而内容极柔美。虚空静寂，读者灵魂中如有音乐。虚空明蓝，读者灵魂上却光明净洁。

大门前石板路有一个斜坡，坡上有绿树成行，长干弱枝，翠叶积叠，如翠等，如羽葆，如旗帜。常有山灵，秀腰白齿，往来其间。遇之者即喑哑。爱能使人喑哑——一种语言歌呼之死亡。“爱与死为邻”。”""",
        'image': InlineImage(doc.tpl, './data/image/a.png', height=Mm(100), width=Mm(100)),  # 图片
        'image2': InlineImage(doc.tpl, i2, height=Mm(100), width=Mm(100)),  # 图片
        'table': [{'name': 'aa', 'age': 10, 'sex': 'male'},
                  {'name': 'bb', 'age': 9, 'sex': 'female'}],  # 表格
        'table2': [],  # 表格
        'richtext': rt
    }
    doc.render(context)
    doc.save()
